package com.baichang.taoshunda.service;

import com.baichang.framework.excelption.ServiceException;
import com.baichang.framework.model.Page;
import com.baichang.taoshunda.entity.Order;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2017/8/17 0017.
 */
public interface OrderService {

    /**
     * 统计当前商家的当前月售
     *
     * @param bussId 商家编号
     * @return
     */
    int getCountByMouthAndBusssId(int bussId);

    /**
     * 根据状态获取商家订单
     *
     * @param bussId     商家编号
     * @param orderState 订单状态
     *                   2：待接单
     *                   3：待配送
     *                   4：退款/售后
     *                   5：进行中
     *                   6：已完成
     *                   10：配送中
     *                   0：全部
     * @param date       日期
     * @param endDate
     * @param nowPage
     * @param pageSize   @return
     */
    List<Map<String, Object>> findBusinessOrderByState(Integer bussId, Integer orderState, String date, String endDate, Integer nowPage, int pageSize);

    /**
     * 根据状态获取商家订单
     *
     * @param bussId     商家编号
     * @param orderState 订单状态
     *                   2：待接单
     *                   3：待配送
     *                   4：退款/售后
     *                   5：进行中
     *                   6：已完成
     *                   10：配送中
     *                   0：全部
     * @param date       日期
     * @param endDate
     * @param nowPage
     * @param pageSize   @return
     */
    List<Map<String, Object>> findBusinessHomeOrderByState(Integer bussId, Integer orderState, String date, String endDate, Integer nowPage, int pageSize);

    /**
     * 商家拒绝接单
     *
     * @param orderNumber  订单编号
     * @param singleReason
     * @return
     */
    boolean businessRefuseTaking(String orderNumber, String singleReason) throws ServiceException;

    /**
     * 商家接单
     *
     * @param orderNumber 订单编号
     * @return
     */
    boolean businessTaking(String orderNumber) throws ServiceException;

    /**
     * 商家同意退款
     *
     * @param orderNumber 订单编号
     * @return
     */
    boolean businessAgreeBack(String orderNumber) throws ServiceException;

    /**
     * 商家拒绝退款
     *
     * @param orderNumber 订单编号
     * @return
     */
    boolean businessRefuseBack(String orderNumber, String reason) throws ServiceException;

    /**
     * 查看订单详情
     *
     * @param orderNumber 订单编号
     * @return
     */
    Map<String, Object> getOrderDetail(String orderNumber) throws ServiceException;

    /**
     * 提交订单
     *
     * @param goods          商品信息
     * @param userId         用户编号
     * @param bussId         商家编号
     * @param bussName       商家名称
     * @param payType        支付类型
     * @param userNmae       收货人
     * @param goodsAddress   收货地址
     * @param phone          收货人电话
     * @param remak          备注
     * @param fee            小费
     * @param dispatching    配送费
     * @param goodsMoney     商品总价
     * @param allMoney       所有价格
     * @param ulng           经度
     * @param ulat           纬度
     * @param deliveryTime   计划配送时间
     * @param subMoney
     * @param invoiceHead
     * @param invoiceNumber  @return
     * @param redPacketMoney
     * @param returnMoney
     * @param isActivity
     * @param orderType
     */
    Map<String, Object> submintOrder(String goods, int userId, int bussId, String bussName, int payType, String userNmae, String goodsAddress, String phone, String remak, double fee, double dispatching, double goodsMoney, double allMoney, double ulng, double ulat, String deliveryTime, double subMoney, String invoiceHead, String invoiceNumber, double redPacketMoney, double returnMoney, int isActivity, int orderType) throws ServiceException;

    /**
     * 查询订单
     * 武圣路
     * 接口
     * 用户端
     *
     * @param orderState 订单状态
     * @param userId     用户编号
     * @param nowPage    当前页
     * @param pageSize   条数
     * @return
     */
    List<Map<String, Object>> getOrderList(Integer orderState, Integer userId, Integer nowPage, Integer pageSize);

    /**
     * 订单详情查询
     *
     * @param orderNumber 订单单号
     * @return
     */
    Map<String, Object> getOrderDetialsByOrderNumber(String orderNumber) throws ServiceException;

    /**
     * 查询订单
     *
     * @param name
     * @param nameUser
     * @param orderNumber
     * @param orderState
     * @param nowPage
     * @param pageSize    @return
     */
    Page queryOrder(String name, String nameUser, String orderNumber, Integer orderState, int nowPage, int pageSize);

    /**
     * 查询订单详细
     *
     * @param orderNumber
     * @param nowPage
     * @param pageSize    @return
     */
    Page<Map<String, Object>> queryOrderDetail(String orderNumber, int nowPage, int pageSize);

    /**
     * 同意退款和拒绝退款
     *
     * @param orderId
     * @param state
     * @param payType
     * @param reason
     * @param orderNumber @return
     * @param fee
     * @param dispatching
     * @param allMoney
     */
    int updateOrderState(Integer orderId, Integer state, Integer goodsId, Integer payType, Integer stock, String reason, String orderNumber, BigDecimal fee, BigDecimal dispatching, BigDecimal allMoney) throws ServiceException;

    /**
     * 获取商家今天收入
     *
     * @param bussId      商家编号
     * @param currentDate 当前日期
     * @return
     */
    Double getBussinessTodayMoney(Integer bussId, String currentDate);

    /**
     * 获取今天的订单数
     *
     * @param bussId      商家编号
     * @param currentDate 当前日期
     * @return
     */
    Integer getBussinessTodayOrder(Integer bussId, String currentDate);

    /**
     * 取消订单
     *
     * @param orderNumber 订单单号
     * @return
     */
    boolean cancelOrder(String orderNumber) throws ServiceException;

    /**
     * 支付订单
     *
     * @param orderNumber 订单单号
     * @param payMethod   支付方式  1支付宝   2微信
     * @param remak       备注
     * @return
     */
    Map<String, Object> payOrder(String orderNumber, int payMethod, String remak) throws ServiceException;

    /**
     * 申请退款
     *
     * @param userId       用户编号
     * @param orderNunber  订单单号
     * @param reasonImg
     * @param reasonRefund @return
     */
    boolean planRefundment(int userId, String orderNunber, String reasonImg, String reasonRefund) throws ServiceException;

    /**
     * 计算优惠金额
     *
     * @param userId
     * @param bussId
     * @param money
     * @return
     */
    Map<String, Object> getDiscountAmount(Integer userId, Integer bussId, Double money) throws ServiceException;

    /**
     * 订单状态详情
     *
     * @param orderNunber 单号
     * @return
     */
    List<Map<String, Object>> getOrderStateDetail(String orderNunber) throws ServiceException;

    /**
     * 商家拒单
     *
     * @param id
     * @param state
     * @param buyerId
     * @param orderNumber
     * @param payType
     * @param goodsId
     * @param stock       @return
     */
    int refuseOrder(Integer id, Integer state, Integer buyerId, String orderNumber, String reason, Integer payType, Integer goodsId, Integer stock) throws ServiceException;

    /**
     * 配送员根据订单状态获取列表
     *
     * @param orderState 订单状态
     * @param dlng       配送员经度
     * @param dlat       配送员纬度
     * @param disId      配送员编号
     * @param nowPage
     * @param pageSize   @return
     */
    List<Map<String, Object>> getOrderListByOrderState(int orderState, Double dlng, Double dlat, int disId, int nowPage, int pageSize) throws ServiceException;

//    /**
//     * 配送员获取订单详情
//     *
//     * @param orderNumber 订单单号
//     * @param dlng        配送员经度
//     * @param dlat        配送员纬度
//     * @return
//     */
//    Map<String, Object> getOrderByOrderNumber(String orderNumber, Double dlng, Double dlat) throws ServiceException;

    /**
     * 配送员查看订单详情
     *
     * @param id   订单编号
     * @param dlng
     * @param dlat @return
     */
    Map<String, Object> getDeliveryOrderDetail(Integer id, Double dlng, Double dlat) throws ServiceException;

    /**
     * 已取货
     *
     * @param id    编号
     * @param disId 配送员编号
     * @return
     */
    boolean pickupOrder(Integer id, Integer disId) throws ServiceException;

    /**
     * 已送达
     *
     * @param id    编号
     * @param disId 配送员编号
     * @return
     */
    boolean deliveredOrder(Integer id, Integer disId) throws ServiceException;

    /**
     * 配送员抢单
     *
     * @param disId   配送员编号
     * @param orderId 订单编号
     * @return
     */
    Map<String, Object> grabOrder(int disId, int orderId) throws ServiceException;

    /**
     * 催单查看
     *
     * @param orderId 订单编号
     * @return
     */
    boolean remindLook(Integer orderId);


    /**
     * 修改订单
     */


    boolean updateOrderStateByOrderNumber(String orderNumber);

    /**
     * @param orderId
     * @return
     */
    Order getOrderMoney(Integer orderId) throws ServiceException;

    /**
     * 修改状态为已完成
     *
     * @param orderId
     * @return
     */
    boolean updateOrderStateByorderId(int orderId);

    /**
     * 查看订单
     *
     * @param orderState 订单状态
     * @param disId      配送员编号
     * @param nowPage    当前页
     * @param pageSize   每页条数
     * @param starTime   开始时间
     * @param endTime    结束时间
     * @param dlng       配送员经度
     * @param dlat       配送员纬度
     * @return
     */
    List<Map<String, Object>> getOrderByIdAndTime(int orderState, int disId, int nowPage, int pageSize, String starTime, String endTime, Double dlng, Double dlat);

    /**
     * @param orderNumber
     * @param disId
     * @return
     */
    boolean updateReminderState(String orderNumber, int disId);

    /**
     * 查询配送员订单
     *
     * @param deliveryId 配送员编号
     * @param state      订单状态
     *                   1：未完成
     * @return
     */
    List<Map<String, Object>> findDeliveryOrderByState(Integer deliveryId, int state);

    /**
     * 申请退货
     *
     * @param orderNumber
     * @param params
     * @param reasonImg
     * @param reasonRefund @return
     */
    boolean applyReturnGoods(String orderNumber, int params, String reasonImg, String reasonRefund) throws ServiceException;

    /**
     * 同意退货
     *
     * @param orderId        订单编号
     * @param orderDetailsId
     * @return
     */
    boolean agreeBackGoodsOrder(Integer orderId, Integer orderDetailsId) throws ServiceException;

    /**
     * 拒绝退货
     *
     * @param orderId        订单编号
     * @param orderDetailsId
     * @return
     */
    boolean refuseBackGoodsOrder(Integer orderId, Integer orderDetailsId);

    /**
     * 确认退还货物
     *
     * @param orderId 订单编号
     * @param orderDetailsId
     * @return
     */
    boolean sureRetunGoods(Integer orderId, Integer orderDetailsId) throws ServiceException;

    /**
     * @param orderNumber
     * @param payMethod
     * @param remark
     * @return
     */
    Map<String, Object> payOrderHtml(String orderNumber, int payMethod, String remark) throws ServiceException;

    /**
     * PC端查询订单
     *
     * @param orderState
     * @param userId
     * @param nowPage
     * @param pageSize
     * @return
     */
    Map<String, Object> getOrderListPc(Integer orderState, Integer userId, Integer nowPage, Integer pageSize);

    /**
     * PC端获取支付状态
     *
     * @param orderNumber 订单号
     * @return
     */
    boolean getPayState(String orderNumber) throws ServiceException;

    /**
     * 查询全部完成的订单数量
     *
     * @param bussId
     * @return
     */
    Integer getAllOrderNumber(Integer bussId);

    /**
     * 用户端删除订单   订单不查询
     *
     * @param orderNumber
     * @return
     */
    boolean removeOrderUserStatus(String orderNumber);

    /**
     * 修改订单价格
     *
     * @param orderId
     * @param money
     * @return
     */
    boolean updateOrderMoney(String orderId, Double money) throws ServiceException;

    /**
     * 预约订单
     *
     * @param goods
     * @param userId
     * @param bussId
     * @param bussName
     * @param username
     * @param goodsAddress
     * @param phone
     * @param remark
     * @param allMoney
     * @param redPacketMoney
     * @param returnMoney
     * @param isActivity     @return
     * @param subMoney
     */
    Map<String, Object> reservationOrder(String goods, int userId, int bussId, String bussName, String username, String goodsAddress, String phone, String remark, double allMoney, double redPacketMoney, double returnMoney, int isActivity, double subMoney) throws ServiceException;

    /**
     * @param orderState
     * @param userId
     * @param nowPage
     * @param pageSize
     * @return
     */
    List<Map<String, Object>> getReservationOrderList(Integer orderState, Integer userId, Integer nowPage, Integer pageSize);

    /**
     * 查看预约订单详情
     *
     * @param orderId
     * @return
     */
    Map<String, Object> getReservationOrderDetails(String orderId) throws ServiceException;

    /**
     * 获取订单下的全部商品
     *
     * @param orderNumber
     * @return
     */
    List<Map<String, Object>> getOrderGoodsList(String orderNumber);

    /**
     * 查看订单列表
     *
     * @param orderState
     * @param bussId
     * @param nowPage
     * @param pageSize
     * @param date
     * @param endDate
     * @return
     */
    List<Map<String, Object>> getReservationOrderListByCompanyId(Integer orderState, Integer bussId, Integer nowPage, Integer pageSize, String date, String endDate);

    /**
     * 预约订单
     *
     * @param userName
     * @param busName
     * @param nowPage
     * @param pageSize    @return
     * @param orderNumber
     * @param orderState
     */
    Page queryAppointmentOrder(String userName, String busName, int nowPage, int pageSize, String orderNumber, Integer orderState);

    /**
     * @param orderNumber
     * @param nowPage
     * @param pageSize    @return
     */
    Page queryReservationOrder(String orderNumber, int nowPage, int pageSize);

    /**
     * 商家送达商品
     *
     * @param orderNumber
     * @return
     */
    boolean deliveredOrderByCompany(String orderNumber) throws ServiceException;

    /**
     * 删除商家不看的订单
     *
     * @param orderNumber
     * @return
     */
    boolean removeOrderCompanyStatus(String orderNumber);

    /**
     * 查看用户红包金额
     *
     * @param userId
     * @return
     */
    Map<Object, Object> getUserRedPacket(Integer userId) throws ServiceException;

    /**
     * @param userId
     * @param trendsId
     * @return
     */
    Map<Object, Object> getTrendCountAndOrderCount(Integer userId, Integer trendsId);

    /**
     * 查询当前是否存在配送中的订单
     *
     * @param id
     * @return
     */
    int getOrderCountByDeliveryId(Integer id);

    /**
     * 申请换货
     *
     * @param orderNumber   订单号
     * @param params        是否支持七天无理由退换货
     * @param barterImg     换货图片
     * @param barterRefund  换货原因
     * @param orderDetailId
     * @return
     */
    boolean applyBarter(String orderNumber, int params, String barterImg, String barterRefund, int orderDetailId) throws ServiceException;

    /**
     * 拒绝换货
     *
     * @param orderId
     * @param orderDetailsId
     * @return
     */
    boolean refuseBarter(Integer orderId, Integer orderDetailsId);

    /**
     * 同意换货
     *
     * @param orderId
     * @param orderDetailsId
     * @return
     */
    boolean agreeBarter(Integer orderId, Integer orderDetailsId);

    /**
     * 申请七天无理由退货
     *
     * @param orderNumber   订单号
     * @param orderDetailId 订单购物详情编号
     * @param params
     * @param reasonImg     退货理由
     * @param reasonRefund  退货图片
     * @return
     */
    boolean applyReturnGoodsByOrderDetailId(String orderNumber, int orderDetailId, int params, String reasonImg, String reasonRefund) throws ServiceException;

    /**
     * 查询理由
     *
     * @param orderDetailsId 订单购物详情编号
     * @return
     */
    List<Map<String, Object>> findReasonByDetailsId(Integer orderDetailsId);

    /**
     * 功能描述: 商家同意退款之后，确认归还货物
     *
     * @param:
     * @return:
     * @auther: wsl
     * @date: 2018/11/22 11:00
     */
    boolean companySure(Integer orderId, Integer companyIsSure) throws ServiceException;

    /**
     * 功能描述:
     * 用户确认自提
     *
     * @param orderNumber 订单号
     * @return:
     * @auther: wsl
     * @date: 2019/1/4 9:25
     */
    boolean sureGoodsSelfIntroduction(String orderNumber) throws ServiceException;
/**
 *
 * 功能描述:
 *
 * @param:
 * @return:
 * @auther: wsl
 * @date: 2019/1/30 10:46
 */
    Object js(Integer orderId);

}
